home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0793 / FINDPW.PAS < prev    next >
Pascal/Delphi Source File  |  1993-08-01  |  3KB  |  83 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 446 of 457                                                               
  3. From : Mark Stephen                        1:2607/102.0         08 Jul 93  13:20 
  4. To   : David Drzyzga                                                             
  5. Subj : Encryption                                                             
  6. ────────────────────────────────────────────────────────────────────────────────
  7. DD>Thaere hasn't been much on this subject for the last couple of weeks, but he
  8. DD>is an encryption/decryption scheme that would be very difficult to crack:
  9.  
  10. Knowing the algorithm _and_ the random number generator (RNG), it's no
  11. trouble at all to crack it. The following code (mainly yours, the rest
  12. obvious) correctly identified the password 111222 in some encrypted text
  13. in a couple of minutes.
  14.  
  15. Ray Gardner posted some clever code in the C echo which will crack most
  16. any xor-encryption scheme provided the message is sufficiently long and
  17. the password is sufficiently short. I don't know the period of your RNG,
  18. but there is probably a trade-off between a long period and using a
  19. well-known RNG -- either Gardner gets you, or brute force and a copy of
  20. Knuth does. There is a RNG known as the r250 algorithm, which is seeded
  21. with a random array of numbers, themselves generated by something
  22. simpler like your RNG. R250 has a period of 2^255 (I think). Suppose you
  23. allowed the user to specify not only the seed but also the increment and
  24. multiplier in your RNG. You'd probably end up with a rotten RNG, but you
  25. only need 250 numbers, so who cares. Now you have a monstrously long
  26. period, and a brute force approach must try 2^96 rather than 2^32
  27. numbers -- still feasible, but a serious nuisance. Better yet, conceal
  28. the details of your algorithm.
  29.  
  30. FWIW (and sorry to mess with your exemplary programming style):}
  31.  
  32. program findpw;
  33.  
  34. uses
  35.   crt;
  36. const bufsize = 128;
  37.       tval = 120;               (* about bufsize * 0.95 *)
  38. var
  39.   Index,
  40.   UserKey, jj : longint;
  41.   NumRead     : word;
  42.   InFile      : file;
  43.   InFileName  : string[79];
  44.   Ch          : char;
  45.   ii, Error   : integer;
  46.   Buf         : array [1..bufsize] of char;
  47.  
  48. function crypt(ch:char):char;
  49. var
  50.   UserKey_byte : byte;
  51. begin
  52.   UserKey_byte := UserKey shr 24;
  53.   crypt := chr(ord(ch) xor ord(UserKey_byte));
  54.   UserKey := $63C5 * UserKey + $A561;
  55.   {The two constants above can be changed but must be prime #s}
  56. end;
  57.  
  58. begin
  59.   clrscr;
  60.   write('Enter FileName to En/Decrypt: ');
  61.   readln(InFileName);
  62.   assign(InFile, InFileName);
  63.   reset(InFile,1);
  64.  
  65.   writeln(#10#13'Testing possible passwords ...');
  66.   blockread(InFile, Buf, Bufsize, NumRead);
  67.   for jj := 1 to MAXLONGINT do begin
  68.     userkey := jj;
  69.     ii := 0;
  70.     for Index := 1 to NumRead do begin
  71.       ch := crypt(Buf1[Index]);
  72.       (* count printable chars, make sure full boolean evaluation is OFF *)
  73.       if (ch < #128) and (ch > #31) and (ch <> #8)
  74.           and (ch <> #10) and (ch <> #13) then
  75.         inc(ii);
  76.     end;
  77.     if ii > tval then begin
  78.       writeln('password was probably ', jj);
  79.       break;
  80.     end;
  81.   end;
  82.   close(InFile);
  83. end.